home *** CD-ROM | disk | FTP | other *** search
- <?xml version='1.0' encoding='UTF-8' ?>
- <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
- <?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
- <!-- $Revision: 1.1.2.8 $ -->
-
- <!--
- Copyright 2003-2004 The Apache Software Foundation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
- <manualpage metafile="auth.xml.meta">
- <parentdocument href="./">How-To / Tutorials</parentdocument>
-
- <title>Authentication, Authorization and Access Control</title>
-
- <summary>
- <p>Authentication is any process by which you verify that
- someone is who they claim they are. Authorization is any
- process by which someone is allowed to be where they want to
- go, or to have information that they want to have.</p>
- </summary>
-
- <section id="related"><title>Related Modules and Directives</title>
- <related>
- <modulelist>
- <module>mod_auth</module>
- <module>mod_access</module>
- </modulelist>
-
- <directivelist>
- <directive module="mod_access">Allow</directive>
- <directive module="mod_auth">AuthGroupFile</directive>
- <directive module="core">AuthName</directive>
- <directive module="core">AuthType</directive>
- <directive module="mod_auth">AuthUserFile</directive>
- <directive module="mod_access">Deny</directive>
- <directive module="core">Options</directive>
- <directive module="core">Require</directive>
- </directivelist>
- </related>
- </section>
-
- <section id="introduction"><title>Introduction</title>
- <p>If you have information on your web site that is sensitive
- or intended for only a small group of people, the techniques in
- this article will help you make sure that the people that see
- those pages are the people that you wanted to see them.</p>
-
- <p>This article covers the "standard" way of protecting parts
- of your web site that most of you are going to use.</p>
- </section>
-
- <section id="theprerequisites"><title>The Prerequisites</title>
- <p>The directives discussed in this article will need to go
- either in your main server configuration file (typically in a
- <directive module="core" type="section">Directory</directive> section), or
- in per-directory configuration files (<code>.htaccess</code> files).</p>
-
- <p>If you plan to use <code>.htaccess</code> files, you will
- need to have a server configuration that permits putting
- authentication directives in these files. This is done with the
- <directive module="core">AllowOverride</directive> directive, which
- specifies which directives, if any, may be put in per-directory
- configuration files.</p>
-
- <p>Since we're talking here about authentication, you will need
- an <directive module="core">AllowOverride</directive> directive like the
- following:</p>
-
- <example>
- AllowOverride AuthConfig
- </example>
-
- <p>Or, if you are just going to put the directives directly in
- your main server configuration file, you will of course need to
- have write permission to that file.</p>
-
- <p>And you'll need to know a little bit about the directory
- structure of your server, in order to know where some files are
- kept. This should not be terribly difficult, and I'll try to
- make this clear when we come to that point.</p>
- </section>
-
- <section id="gettingitworking"><title>Getting it working</title>
- <p>Here's the basics of password protecting a directory on your
- server.</p>
-
- <p>You'll need to create a password file. This file should be
- placed somewhere not accessible from the web. This is so that
- folks cannot download the password file. For example, if your
- documents are served out of <code>/usr/local/apache/htdocs</code> you
- might want to put the password file(s) in
- <code>/usr/local/apache/passwd</code>.</p>
-
- <p>To create the file, use the <a
- href="../programs/htpasswd.html">htpasswd</a> utility that came
- with Apache. This will be located in the <code>bin</code> directory
- of wherever you installed Apache. To create the file, type:</p>
-
- <example>
- htpasswd -c /usr/local/apache/passwd/passwords rbowen
- </example>
-
- <p><code>htpasswd</code> will ask you for the password, and
- then ask you to type it again to confirm it:</p>
-
- <example>
- # htpasswd -c /usr/local/apache/passwd/passwords rbowen<br />
- New password: mypassword<br />
- Re-type new password: mypassword<br />
- Adding password for user rbowen
- </example>
-
- <p>If <code>htpasswd</code> is not in your path, of course
- you'll have to type the full path to the file to get it to run.
- On my server, it's located at
- <code>/usr/local/apache/bin/htpasswd</code></p>
-
- <p>Next, you'll need to configure the server to request a
- password and tell the server which users are allowed access.
- You can do this either by editing the <code>httpd.conf</code>
- file or using an <code>.htaccess</code> file. For example, if
- you wish to protect the directory
- <code>/usr/local/apache/htdocs/secret</code>, you can use the
- following directives, either placed in the file
- <code>/usr/local/apache/htdocs/secret/.htaccess</code>, or
- placed in <code>httpd.conf</code> inside a <Directory
- /usr/local/apache/apache/htdocs/secret> section.</p>
-
- <example>
- AuthType Basic<br />
- AuthName "Restricted Files"<br />
- AuthUserFile /usr/local/apache/passwd/passwords<br />
- Require user rbowen
- </example>
-
- <p>Let's examine each of those directives individually. The <directive
- module="core">AuthType</directive> directive selects
- that method that is used to authenticate the user. The most
- common method is <code>Basic</code>, and this is the method
- implemented by <module>mod_auth</module>. It is important to be aware,
- however, that Basic authentication sends the password from the client to
- the browser unencrypted. This method should therefore not be used for
- highly sensitive data. Apache supports one other authentication method:
- <code>AuthType Digest</code>. This method is implemented by <module
- >mod_auth_digest</module> and is much more secure. Only the most recent
- versions of clients are known to support Digest authentication.</p>
-
- <p>The <directive module="core">AuthName</directive> directive sets
- the <dfn>Realm</dfn> to be used in the authentication. The realm serves
- two major functions. First, the client often presents this information to
- the user as part of the password dialog box. Second, it is used by the
- client to determine what password to send for a given authenticated
- area.</p>
-
- <p>So, for example, once a client has authenticated in the
- <code>"Restricted Files"</code> area, it will automatically
- retry the same password for any area on the same server that is
- marked with the <code>"Restricted Files"</code> Realm.
- Therefore, you can prevent a user from being prompted more than
- once for a password by letting multiple restricted areas share
- the same realm. Of course, for security reasons, the client
- will always need to ask again for the password whenever the
- hostname of the server changes.</p>
-
- <p>The <directive module="mod_auth">AuthUserFile</directive>
- directive sets the path to the password file that we just
- created with <code>htpasswd</code>. If you have a large number
- of users, it can be quite slow to search through a plain text
- file to authenticate the user on each request. Apache also has
- the ability to store user information in fast database files.
- The <module>mod_auth_dbm</module> module provides the <directive
- module="mod_auth_dbm">AuthDBMUserFile</directive> directive. These
- files can be created and manipulated with the <a
- href="../programs/dbmmanage.html">dbmmanage</a> program. Many
- other types of authentication options are available from third
- party modules in the <a
- href="http://modules.apache.org/">Apache Modules
- Database</a>.</p>
-
- <p>Finally, the <directive module="core">Require</directive>
- directive provides the authorization part of the process by
- setting the user that is allowed to access this region of the
- server. In the next section, we discuss various ways to use the
- <directive module="core">Require</directive> directive.</p>
- </section>
-
- <section id="lettingmorethanonepersonin"><title>Letting more than one
- person in</title>
- <p>The directives above only let one person (specifically
- someone with a username of <code>rbowen</code>) into the
- directory. In most cases, you'll want to let more than one
- person in. This is where the <directive module="mod_auth"
- >AuthGroupFile</directive> comes in.</p>
-
- <p>If you want to let more than one person in, you'll need to
- create a group file that associates group names with a list of
- users in that group. The format of this file is pretty simple,
- and you can create it with your favorite editor. The contents
- of the file will look like this:</p>
-
- <example>
- GroupName: rbowen dpitts sungo rshersey
- </example>
-
- <p>That's just a list of the members of the group in a long
- line separated by spaces.</p>
-
- <p>To add a user to your already existing password file,
- type:</p>
-
- <example>
- htpasswd /usr/local/apache/passwd/passwords dpitts
- </example>
-
- <p>You'll get the same response as before, but it will be
- appended to the existing file, rather than creating a new file.
- (It's the <code>-c</code> that makes it create a new password
- file).</p>
-
- <p>Now, you need to modify your <code>.htaccess</code> file to
- look like the following:</p>
-
- <example>
- AuthType Basic<br />
- AuthName "By Invitation Only"<br />
- AuthUserFile /usr/local/apache/passwd/passwords<br />
- AuthGroupFile /usr/local/apache/passwd/groups<br />
- Require group GroupName
- </example>
-
- <p>Now, anyone that is listed in the group <code>GroupName</code>,
- and has an entry in the <code>password</code> file, will be let in, if
- they type the correct password.</p>
-
- <p>There's another way to let multiple users in that is less
- specific. Rather than creating a group file, you can just use
- the following directive:</p>
-
- <example>
- Require valid-user
- </example>
-
- <p>Using that rather than the <code>Require user rbowen</code>
- line will allow anyone in that is listed in the password file,
- and who correctly enters their password. You can even emulate
- the group behavior here, by just keeping a separate password
- file for each group. The advantage of this approach is that
- Apache only has to check one file, rather than two. The
- disadvantage is that you have to maintain a bunch of password
- files, and remember to reference the right one in the
- <directive module="mod_auth">AuthUserFile</directive> directive.</p>
- </section>
-
- <section id="possibleproblems"><title>Possible problems</title>
- <p>Because of the way that Basic authentication is specified,
- your username and password must be verified every time you
- request a document from the server. This is even if you're
- reloading the same page, and for every image on the page (if
- they come from a protected directory). As you can imagine, this
- slows things down a little. The amount that it slows things
- down is proportional to the size of the password file, because
- it has to open up that file, and go down the list of users
- until it gets to your name. And it has to do this every time a
- page is loaded.</p>
-
- <p>A consequence of this is that there's a practical limit to
- how many users you can put in one password file. This limit
- will vary depending on the performance of your particular
- server machine, but you can expect to see slowdowns once you
- get above a few hundred entries, and may wish to consider a
- different authentication method at that time.</p>
- </section>
-
- <section id="whatotherneatstuffcanido"><title>What other neat stuff can I
- do?</title>
- <p>Authentication by username and password is only part of the
- story. Frequently you want to let people in based on something
- other than who they are. Something such as where they are
- coming from.</p>
-
- <p>The <directive module="mod_access">Allow</directive> and
- <directive module="mod_access">Deny</directive> directives let
- you allow and deny access based on the host name, or host
- address, of the machine requesting a document. The
- <directive module="mod_access">Order</directive> directive goes
- hand-in-hand with these two, and tells Apache in which order to
- apply the filters.</p>
-
- <p>The usage of these directives is:</p>
-
- <example>
- Allow from <var>address</var>
- </example>
-
- <p>where <var>address</var> is an IP address (or a partial IP
- address) or a fully qualified domain name (or a partial domain
- name); you may provide multiple addresses or domain names, if
- desired.</p>
-
- <p>For example, if you have someone spamming your message
- board, and you want to keep them out, you could do the
- following:</p>
-
- <example>
- Deny from 205.252.46.165
- </example>
-
- <p>Visitors coming from that address will not be able to see
- the content covered by this directive. If, instead, you have a
- machine name, rather than an IP address, you can use that.</p>
-
- <example>
- Deny from <var>host.example.com</var>
- </example>
-
- <p>And, if you'd like to block access from an entire domain,
- you can specify just part of an address or domain name:</p>
-
- <example>
- Deny from <var>192.101.205</var><br />
- Deny from <var>cyberthugs.com</var> <var>moreidiots.com</var><br />
- Deny from ke
- </example>
-
- <p>Using <directive module="mod_access">Order</directive> will let you be
- sure that you are actually restricting things to the group that you want
- to let in, by combining a <directive module="mod_access">Deny</directive>
- and an <directive module="mod_access">Allow</directive> directive:</p>
-
- <example>
- Order deny,allow<br />
- Deny from all<br />
- Allow from <var>dev.example.com</var>
- </example>
-
- <p>Listing just the <directive module="mod_access">Allow</directive>
- directive would not do what you want, because it will let folks from that
- host in, in addition to letting everyone in. What you want is to let
- <em>only</em> those folks in.</p>
- </section>
-
- <section id="moreinformation"><title>More information</title>
- <p>You should also read the documentation for <module>mod_auth</module>
- and <module>mod_access</module> which contain some more information
- about how this all works.</p>
- </section>
- </manualpage>
-
-